基本介绍

Babel 是一个编译器,主要用于将最新的 JavaScript 代码转化为向后兼容的代码,以便在老版本的浏览器或环境中运行。

例如,你可能在开发时使用了 ES6、ES7 或者更高级的 JavaScript 特性,但是有些浏览器可能并不支持这些新特性,这时就可以用 Babel 来将代码转化为 ES5 或者更早版本的 JavaScript,以确保代码能在多数浏览器中正常运行。

其次,Babel 更像是一个平台,它本身的核心功能就是解析代码到 [[002.抽象语法树|抽象语法树]]( AST),然后再将 AST 转回 JavaScript 代码。所有的语法转换(例如将 ES6 转化为 ES5)和功能添加(例如 polyfills)都是通过各种插件来实现的。

以下是 Babel 的一些主要功能:

polyfill

Array.prototype.includes 这个 API 是 ES2016 的新特性,一些旧的浏览器不支持,像这种情况就需要通过 polyfill 补充缺失的特性,polyfill 就是一段 JS 代码而已,这段代码会去检查当前的浏览器是否支持该 API,如果不支持,polyfill 里面提供了该 API 的实现

if (!Array.prototype.includes) {
  Array.prototype.includes = function() {...}
}

在前端开发中,Babel 被广泛用于现代 JavaScript 项目,它能确保代码在各种环境中运行,而不需要手动处理各种浏览器和 JavaScript 版本的兼容性问题。

快速入门

新建一个项目 babel-demo,使用 pnpm init 初始化后安装依赖:

pnpm add --save-dev @babel/core @babel/cli @babel/preset-env

src/index.js 中书写测试代码:

const greet = (name) => `Hello, ${name}!`;
console.log(greet("World"));

接下来在项目的根目录下创建 .babelrc 配置文件,书写如下的配置:

{
  "presets": ["@babel/preset-env"]
}

之后在 package.json 里添加 script 脚本命令:

"scripts": {
    // ...
    "babel": "babel src --out-dir lib"
},

运行脚本,编译结果如下:

"use strict";

var greet = function greet(name) {
  return "Hello, ".concat(name, "!");
};
console.log(greet("World"));

修改配置文件,指定了浏览器范围:

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "targets": {
          "edge": "17",
          "firefox": "60",
          "chrome": "67",
          "safari": "11.1"
        },
        "useBuiltIns": "usage",
        "corejs": "3.6.5"
      }
    ]
  ]
}

这一次编译出来的结果如下:

"use strict";

const greet = name => "Hello, ".concat(name, "!");
console.log(greet("World"));

为什么两次不一样呢?原因很简单,第二次我们指定了浏览器版本范围,在指定的浏览器版本范围里的这些浏览器,某一些特性已经支持了,所以就不需要再做转换了。